package com.annotationAndReflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

//通过反射动态的创建对象，并对其方法属性进行操作
//通过调用Class对象的newInstance方法
public class TestDynCreObj {
    public static void main(String[] args) throws Exception {
        //获得Class对象
        Class c1 = Class.forName("com.annotationAndReflection.User");
        //=====构造一个对象
        //User user = (User) c1.newInstance();//本质是调用了类的无参构造器
        //System.out.println(user);//User{name='null', id=0, age=0}

        //=====通过构造器创建对象
        //Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        //User user2  = (User) declaredConstructor.newInstance("void",001, 20);
        //System.out.println(user2);//User{name='void', id=1, age=20}

        //=====通过反射调用普通方法
        User user3 =(User) c1.newInstance();
        //通过反射获取方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //通过invoke激活使用方法
        setName.invoke(user3,"cmy");
        System.out.println(user3.getName());//cmy
        System.out.println("===================");

        //======通过反射操作属性
        User user4 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");
        //需要关掉权限检测，由于属性多私有，不关会报错
        name.setAccessible(true);
        name.set(user4,"xiaoming");
        System.out.println(user4.getName());

    }
}

    